home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 11 / CU Amiga Magazine's Super CD-ROM 11 (1997)(EMAP Images)(GB)(Track 1 of 3)[!][issue 1997-06].iso / cucd / graphics / dsscripts / pie.dsrx < prev    next >
Text File  |  1997-03-08  |  4KB  |  157 lines

  1. /* Allow commands to return results */
  2.  
  3. options results
  4.  
  5. /* On error, goto ERROR:. Comment out this line if you wish to */
  6. /* perform your own error checking. */
  7.  
  8. signal on error
  9.  
  10. 'PROJECT_LOCK'
  11.  
  12. /* BEGIN PROGRAM *************************************************/
  13.  
  14. /* +++++++++++++++++++++++++++++++++++ */
  15. /* +                                 + */
  16. /* + Pie chart plotting ARexx script + */
  17. /* +                                 + */
  18. /* +      Written by Andrew Elia     + */
  19. /* +                                 + */
  20. /* +++++++++++++++++++++++++++++++++++ */
  21.  
  22. PIESIZE = 10    /*  */
  23. CENX = 10        /*  */
  24. CENY = 10        /*  */
  25. UNIT = "cm"        /* Sets the measurement units */
  26.  
  27. GSIZE = 5        /* Sets the number of values/slices in the pie */
  28.  
  29. /* Just creates some data to demonstrate the effect */
  30.  
  31. Do N=0 To GSIZE-1
  32. X=(N + 1) * 4
  33. GRAPH.N = X
  34. End N
  35.  
  36. /* Finds the total size of the data used, so that each slice can */
  37. /* be scaled accordingly */
  38.  
  39. PIEMAX=0
  40. Do N = 0 To GSIZE-1
  41. PIEMAX = PIEMAX + GRAPH.N
  42. End N
  43.  
  44. /* Opens the rexxmathlib.library so that trigonometric functions  */
  45. /* are available, and sets up a variable which is used to convert */
  46. /* Degrees to Radians as the library only works in Radians */
  47.  
  48. call addlib("rexxmathlib.library", 0, -30, 0)
  49. CONVERT=PI(0)/180
  50.  
  51. PIEANG = 0
  52. Do N = 0 To GSIZE-1
  53.  
  54. /* Works out the size/angle of a particular slice */
  55.  
  56.     SLICE = GRAPH.N / PIEMAX
  57.     SLICEANG = 360 * SLICE
  58.  
  59. /* Calculates the positions of each of the two edges of the slice */
  60.  
  61.     X1 = (Sin(CONVERT * PIEANG) * PIESIZE) + CENX
  62.     Y1 = (Cos(CONVERT * PIEANG) * PIESIZE) + CENY
  63.     X2 = (Sin(CONVERT * (PIEANG + SLICEANG)) * PIESIZE) + CENX
  64.     Y2 = (Cos(CONVERT * (PIEANG + SLICEANG)) * PIESIZE) + CENY
  65.  
  66. /* Now the naff bit. This has a stab at trying to make the outer */
  67. /* edges of the slices look like an arc. Doesn't quite look the  */
  68. /* part, though. Let me know if you find a more appropriate way  */
  69. /* of dealing with this. */
  70.  
  71.     LB = SLICE * PIESIZE
  72.  
  73.     L1 = LB + Sqr(Pow(Abs(X1-CENX),2) + Pow(Abs(Y1-CENY),2))
  74.     L2 = LB + Sqr(Pow(Abs(X2-CENX),2) + Pow(Abs(Y2-CENY),2))
  75.  
  76.     B1 = (Sin(CONVERT * PIEANG) * L1) + CENX
  77.     B2 = (Cos(CONVERT * PIEANG) * L1) + CENY
  78.     B3 = (Sin(CONVERT * (PIEANG + SLICEANG)) * L2) + CENX
  79.     B4 = (Cos(CONVERT * (PIEANG + SLICEANG)) * L2) + CENY
  80.  
  81. /* This actuall draws the slice */
  82.  
  83.     "CREATE_BEZIER CLOSED "||CENX||UNIT||" "||CENY||UNIT||" L "||X1||UNIT||" "||Y1||UNIT||" B "||B1||UNIT||" "||B2||UNIT||" "||B3||UNIT||" "||B4||UNIT||" "||X2||UNIT||" "||Y2||UNIT
  84.  
  85.     PIEANG = PIEANG + SLICEANG
  86. End N
  87.  
  88. /* For the time being, this bit has been added to provide a reference */
  89. /* for the user to correct the crap bits on the pie slices. */
  90.  
  91. "CREATE_ELLIPSE "||CENX||UNIT||" "||CENY||UNIT||" "||PIESIZE||UNIT||" "||PIESIZE||UNIT
  92.  
  93. /* END PROGRAM ***************************************************/
  94.  
  95. 'PROJECT_UNLOCK'
  96.  
  97. exit
  98.  
  99. /* On ERROR */
  100.  
  101. ERROR:
  102.  
  103. 'PROJECT_UNLOCK'
  104.  
  105. /* If we get here, either an error occurred with the command's */
  106. /* execution or there was an error with the command itself. */
  107. /* In the former case, rc2 contains the error message and in */
  108. /* the latter, rc2 contains an error number. SIGL contains */
  109. /* the line number of the command which caused the jump */
  110. /* to ERROR: */
  111.  
  112. if datatype(rc2,'NUMERIC') == 1 then do
  113.     /* See if we can describe the error with a string */
  114.  
  115.     select
  116.         when rc2 == 103 then
  117.             err_string = "ERROR 103, "||,
  118.                 "out of memory at line "||SIGL
  119.         when rc2 == 114 then
  120.             err_string = "ERROR 114, "||,
  121.                 "bad command template at line "||SIGL
  122.         when rc2 == 115 then
  123.             err_string = "ERROR 115, "||,
  124.                 "bad number for /N argument at line "||SIGL
  125.         when rc2 == 116 then
  126.             err_string = "ERROR 116, "||,
  127.                 "required argument missing at line "||SIGL
  128.         when rc2 == 117 then
  129.             err_string = "ERROR 117, "||,
  130.                 "value after keywork missing at line "||SIGL
  131.         when rc2 == 118 then
  132.             err_string = "ERROR 118, "||,
  133.                 "wrong number of arguments at line "||SIGL
  134.         when rc2 == 119 then
  135.             err_string = "ERROR 119, "||,
  136.                 "unmatched quotes at line "||SIGL
  137.         when rc2 == 120 then
  138.             err_string = "ERROR 120, "||,
  139.                 "line too long at line "||SIGL
  140.         when rc2 == 236 then
  141.             err_string = "ERROR 236, "||,
  142.                 "unknown command at line "||SIGL
  143.         otherwise
  144.             err_string = "ERROR "||rc2||", at line "||SIGL
  145.         end
  146.     end
  147. else if rc2 == 'RC2' then do
  148.     err_string = "ERROR in command at line "||SIGL
  149.     end
  150. else do
  151.     err_string = rc2||", line "||SIGL
  152.     end
  153.  
  154. req_message TEXT '"'err_string'"'
  155.  
  156. exit
  157.